#include <iostream>

using namespace std;

class WidgetImpl
{
public:
    WidgetImpl();

private:
    int a, b, c;
};

class Widget
{
public:
    void swap(Widget &other)
    {
        using std::swap;
        swap(pImpl, other.pImpl);
    }
public:
    Widget(const Widget& rhs);

private:
    WidgetImpl *pImpl;
};

namespace std
{
    template<>
    void swap<Widget>(Widget &a, Widget &b)
    {
        a.swap(b);
    }
}

int main(int argc, char *argv[])
{
    return 0;
}
